import router from '@/router'
import { asyncRoutes } from '@/router'
import store from '@/store'
// import { Message } from 'element-ui'
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
// import { getToken } from '@/utils/auth' // get token from cookie
// import getPageTitle from '@/utils/get-page-title'

// 白名单
const whiteList = ['/login', '/404']
// to:跳转到哪里去
// from:从哪里跳转的过来
// next:放行或者重定向  next()   next('/')
router.beforeEach(async(to, from, next) => {
  // 加载条开始加载
  NProgress.start()
  // 获取token
  const token = store.getters.token
  // 获取用户信息方便判断
  const userInfo = store.state.user.userInfo
  //   如果有
  if (token) {
    // 如果有token  去登录页
    if (to.path === '/login') {
      // 跳转到首页
      next('/')
      // 加载结束
      NProgress.done()
    } else {
      // 有token  去其他页面 方形
      // 再跳转到之前  需要先获取用户权限信息 然后根据权限再渲染页面
      // 判断是不是空对象  对象属性名放到数组 判断是不是为空
      if (Object.keys(userInfo).length <= 0) {
        const { roles: { menus }} = await store.dispatch('user/getUserProfile')
        // console.log(menus)
        // 根据返回来的用户权限信息  在所有的动态路由里过滤
        let otherRoutes = asyncRoutes.filter(item => menus.includes(item.children[0].name))
        // 调用vuex里的方法  把otherRoutes存到vuex里
        otherRoutes = [...otherRoutes, { path: '*', redirect: '/404', hidden: true }]
        store.commit('permission/setRoutes', otherRoutes)
        // 拿到权限标识之后
        // 1.那menus和动态路由进行筛选，得到符合条件的路由规则

        // 2.拿到符合条件的路由规则之后，动态添加到路由对象中
        router.addRoutes(asyncRoutes) // 异步执行
        // 下面这行代码可以保证addRoutes 异步执行完毕
        next({
          ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
          replace: true // 重进一次, 不保留重复历史
        })
        return
      }
      next()
    }
  } else {
    // 没有token的场景
    if (whiteList.includes(to.path)) {
      // 如果去的是白名单里的页面  放行
      next()
    } else {
      // 没有token 去其他页面 不放行 跳转到登录
      next('/login')
      // 加载结束
      NProgress.done()
    }
  }
})
// 后置路由守卫
router.afterEach((to, from) => {
  // 加载结束   再next('地址')/重定向的时候  不会执行后置路由守卫  单独添加
  NProgress.done()
})
